package feevale.boteco.view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import feevale.boteco.bean.Boteco;
import feevale.boteco.bean.Garcon;
import feevale.boteco.bean.Geladeira;
import feevale.boteco.util.ChamaOsBebados;

public class BotecoFrm extends JFrame {

	private static final String TITLE = "Boteco";

	private JTextField txCapacidadeMaxima;
	private JTextField txCapacidadeMinima;
	private JTextField txNumeroClientes;
	private JTextField txNumeroGarcons;
	private JTextField txTempoConsumoClienteInicial;
	private JTextField txTempoConsumoClienteFinal;
	private JTextField txTempoBuscaClienteInicial;
	private JTextField txTempoBuscaClienteFinal;
	private JTextField txTempoReposicaoGarconInicial;
	private JTextField txTempoReposicaoGarconFinal;

	private Geladeira geladeira1;
	private Geladeira geladeira2;
	private Geladeira geladeira3;

	private JButton btnIniciar;
	private JButton btnFinalizar;

	private Boteco boteco;

	private ChamaOsBebados chamaOsBebados;

	public BotecoFrm(Boteco boteco) {

		this.boteco = boteco;

		setTitle(TITLE);
		setSize(905, 670);
		setLayout(null);
		setLocationRelativeTo(null);

		initParameters();

		setResizable(false);
		setVisible(true);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	}

	private void initGeladeiras() {
		geladeira1 = new Geladeira(1, boteco);
		Boteco.GELADEIRAS.add(geladeira1);
		geladeira2 = new Geladeira(2, boteco);
		Boteco.GELADEIRAS.add(geladeira2);
		geladeira3 = new Geladeira(3, boteco);
		Boteco.GELADEIRAS.add(geladeira3);
	}

	private void initLayout() {
		geladeira1.setBounds(10, 130, 280, 500);
		add(geladeira1);

		geladeira2.setBounds(310, 130, 280, 500);
		add(geladeira2);

		geladeira3.setBounds(610, 130, 280, 500);
		add(geladeira3);

		repaint();
	}

	private void initParameters() {

		JPanel pnlParametros = new JPanel();
		pnlParametros.setLayout(null);
		pnlParametros.setBorder(BorderFactory.createTitledBorder("Parâmetros"));
		pnlParametros.setBounds(10, 10, 880, 115);

		JLabel lblCapacidadeMinima = new JLabel("Capacidade Mín:");
		lblCapacidadeMinima.setBounds(10, 20, 140, 20);
		pnlParametros.add(lblCapacidadeMinima);

		txCapacidadeMinima = new JTextField(Boteco.DEFAULT_CAPACIDADE_MINIMA.toString());
		txCapacidadeMinima.setBounds(160, 20, 55, 20);
		pnlParametros.add(txCapacidadeMinima);

		JLabel lblCapacidadeMaxima = new JLabel("Capacidade Máx.:");
		lblCapacidadeMaxima.setBounds(225, 20, 140, 20);
		pnlParametros.add(lblCapacidadeMaxima);

		txCapacidadeMaxima = new JTextField(Boteco.DEFAULT_CAPACIDADE_MAXIMA.toString());
		txCapacidadeMaxima.setBounds(375, 20, 55, 20);
		pnlParametros.add(txCapacidadeMaxima);

		JLabel lblNumeroClientes = new JLabel("Número Clientes:");
		lblNumeroClientes.setBounds(440, 20, 140, 20);
		pnlParametros.add(lblNumeroClientes);

		txNumeroClientes = new JTextField(Boteco.DEFAULT_NUMERO_CLIENTES.toString());
		txNumeroClientes.setBounds(590, 20, 55, 20);
		pnlParametros.add(txNumeroClientes);

		JLabel lblNumeroGarcons = new JLabel("Número Garçons:");
		lblNumeroGarcons.setBounds(655, 20, 140, 20);
		pnlParametros.add(lblNumeroGarcons);

		txNumeroGarcons = new JTextField(Boteco.DEFAULT_NUMERO_GARCONS.toString());
		txNumeroGarcons.setBounds(805, 20, 55, 20);
		pnlParametros.add(txNumeroGarcons);

		JLabel lblTempoConsumoClienteInicial = new JLabel("Consumo Inicial:");
		lblTempoConsumoClienteInicial.setBounds(10, 50, 140, 20);
		pnlParametros.add(lblTempoConsumoClienteInicial);

		txTempoConsumoClienteInicial = new JTextField(Boteco.DEFAULT_TEMPO_CONSUMO_INICIAL.toString());
		txTempoConsumoClienteInicial.setBounds(160, 50, 55, 20);
		pnlParametros.add(txTempoConsumoClienteInicial);

		JLabel lblTempoConsumoClienteFinal = new JLabel("Consumo Final:");
		lblTempoConsumoClienteFinal.setBounds(225, 50, 140, 20);
		pnlParametros.add(lblTempoConsumoClienteFinal);

		txTempoConsumoClienteFinal = new JTextField(Boteco.DEFAULT_TEMPO_CONSUMO_FINAL.toString());
		txTempoConsumoClienteFinal.setBounds(375, 50, 55, 20);
		pnlParametros.add(txTempoConsumoClienteFinal);

		JLabel lblTempoBuscaClienteInicial = new JLabel("Busca Inicial:");
		lblTempoBuscaClienteInicial.setBounds(440, 50, 140, 20);
		pnlParametros.add(lblTempoBuscaClienteInicial);

		txTempoBuscaClienteInicial = new JTextField(Boteco.DEFAULT_TEMPO_BUSCA_INICIAL.toString());
		txTempoBuscaClienteInicial.setBounds(590, 50, 55, 20);
		pnlParametros.add(txTempoBuscaClienteInicial);

		JLabel lblTempoBuscaClienteFinal = new JLabel("Busca Final:");
		lblTempoBuscaClienteFinal.setBounds(655, 50, 140, 20);
		pnlParametros.add(lblTempoBuscaClienteFinal);

		txTempoBuscaClienteFinal = new JTextField(Boteco.DEFAULT_TEMPO_BUSCA_FINAL.toString());
		txTempoBuscaClienteFinal.setBounds(805, 50, 55, 20);
		pnlParametros.add(txTempoBuscaClienteFinal);

		JLabel lblTempoReposicaoGarconInicial = new JLabel("Reposição Inicial:");
		lblTempoReposicaoGarconInicial.setBounds(10, 80, 140, 20);
		pnlParametros.add(lblTempoReposicaoGarconInicial);

		txTempoReposicaoGarconInicial = new JTextField(Boteco.DEFAULT_TEMPO_REPOSICAO_INICIAL.toString());
		txTempoReposicaoGarconInicial.setBounds(160, 80, 55, 20);
		pnlParametros.add(txTempoReposicaoGarconInicial);

		JLabel lblTempoReposicaoGarconFinal = new JLabel("Reposição Final:");
		lblTempoReposicaoGarconFinal.setBounds(225, 80, 140, 20);
		pnlParametros.add(lblTempoReposicaoGarconFinal);

		txTempoReposicaoGarconFinal = new JTextField(Boteco.DEFAULT_TEMPO_REPOSICAO_FINAL.toString());
		txTempoReposicaoGarconFinal.setBounds(375, 80, 55, 20);
		pnlParametros.add(txTempoReposicaoGarconFinal);

		btnIniciar = new JButton("Iniciar");
		btnIniciar.setBounds(650, 80, 100, 25);
		btnIniciar.addActionListener(getIniciarListener());
		pnlParametros.add(btnIniciar);

		btnFinalizar = new JButton("Finalizar");
		btnFinalizar.setBounds(760, 80, 100, 25);
		btnFinalizar.setEnabled(false);
		btnFinalizar.addActionListener(getFinalizarListener());
		pnlParametros.add(btnFinalizar);

		add(pnlParametros);
	}

	private ActionListener getIniciarListener() {
		return new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				atualizaParametrizacao();

				parametrosHabilitados(false);

				initGeladeiras();
				initLayout();

				contrataGarcons();

				chamaOsBebados = new ChamaOsBebados(boteco);
				chamaOsBebados.inicia();

				btnIniciar.setEnabled(false);
				btnFinalizar.setEnabled(true);
			}
		};
	}

	private ActionListener getFinalizarListener() {
		return new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				chamaOsBebados.finaliza();

				remove(geladeira1);
				remove(geladeira2);
				remove(geladeira3);

				repaint();

				parametrosHabilitados(true);

				boteco.setup();

				btnIniciar.setEnabled(true);
				btnFinalizar.setEnabled(false);
			}
		};
	}

	private void parametrosHabilitados(boolean bool) {
		txCapacidadeMaxima.setEditable(bool);
		txCapacidadeMinima.setEditable(bool);
		txNumeroClientes.setEditable(bool);
		txNumeroGarcons.setEditable(bool);
		txTempoConsumoClienteInicial.setEditable(bool);
		txTempoConsumoClienteFinal.setEditable(bool);
		txTempoBuscaClienteInicial.setEditable(bool);
		txTempoBuscaClienteFinal.setEditable(bool);
		txTempoReposicaoGarconInicial.setEditable(bool);
		txTempoReposicaoGarconFinal.setEditable(bool);
	}

	/**
	 * Atualiza as variáveis da classe {@link Boteco} conforme valores de
	 * entrada.
	 */
	private void atualizaParametrizacao() {
		Boteco.DEFAULT_CAPACIDADE_MAXIMA = Integer.parseInt(txCapacidadeMaxima.getText());
		Boteco.DEFAULT_CAPACIDADE_MINIMA = Integer.parseInt(txCapacidadeMinima.getText());
		Boteco.DEFAULT_NUMERO_CLIENTES = Integer.parseInt(txNumeroClientes.getText());
		Boteco.DEFAULT_NUMERO_GARCONS = Integer.parseInt(txNumeroGarcons.getText());
		Boteco.DEFAULT_TEMPO_CONSUMO_INICIAL = Integer.parseInt(txTempoConsumoClienteInicial.getText());
		Boteco.DEFAULT_TEMPO_CONSUMO_FINAL = Integer.parseInt(txTempoConsumoClienteFinal.getText());
		Boteco.DEFAULT_TEMPO_BUSCA_INICIAL = Integer.parseInt(txTempoBuscaClienteInicial.getText());
		Boteco.DEFAULT_TEMPO_BUSCA_FINAL = Integer.parseInt(txTempoBuscaClienteFinal.getText());
		Boteco.DEFAULT_TEMPO_REPOSICAO_INICIAL = Integer.parseInt(txTempoReposicaoGarconInicial.getText());
		Boteco.DEFAULT_TEMPO_REPOSICAO_FINAL = Integer.parseInt(txTempoReposicaoGarconFinal.getText());
	}

	private void contrataGarcons() {

		for (int i = 1; i <= Boteco.DEFAULT_NUMERO_GARCONS; i++) {
			Garcon garcon = new Garcon();
			garcon.setId(i);

			Boteco.GARCONS.offer(garcon);
		}
	}

}